﻿using System.Collections;
using System.Collections.Generic;

using BodaNetCommunications.Utilities.Tools;

namespace BodaNetCommunications.Utilities.Results
{
    //
    // 摘要:
    //     操作结果的泛型类，允许带一个用户自定义的泛型对象，推荐使用这个类
    //
    // 类型参数:
    //   T:
    //     泛型类
    public class BodaResult<T> : BodaResult
    {
        /// <summary>
        /// 结果数据数据
        /// </summary>
        public List<T> Datas { get; set; } = new List<T>();
        //public ArrayList Datas { get; set; } = new ArrayList();

        /// <summary>
        /// 性能比Datas好: DataList.Add(<data>)
        /// </summary>
        public ArrayList DataList { get; set; } = new ArrayList();

        public List<object> Temp { get; set; } = new List<object>();

        /// <summary>
        /// 原始数据的字节数组
        /// </summary>
        public List<byte> DataBytes { get; set; } = new List<byte>();

        //
        // 摘要:
        //     用户自定义的泛型数据
        public T? Content { get; set; }

        //
        // 摘要:
        //     实例化一个默认的结果对象
        public BodaResult() : base(true, "OK")
        {
           
        }

        //
        // 摘要:
        //     使用指定的消息实例化一个默认的结果对象
        //
        // 参数:
        //   msg:
        //     错误消息
        public BodaResult(string msg)
            : base(msg)
        {
        }

        //
        // 摘要:
        //     使用错误代码，消息文本来实例化对象
        //
        // 参数:
        //   err:
        //     错误代码
        //
        //   msg:
        //     错误消息
        public BodaResult(int err, string msg)
            : base(err, msg)
        {
        }
    }

    public class BodaResult<T1, T2> : BodaResult
    {
        //
        // 摘要:
        //     用户自定义的泛型数据
        public T1 Content1 { get; set; }

        public T2 Content2 { get; set; }

        //
        // 摘要:
        //     实例化一个默认的结果对象
        public BodaResult()
        {
        }

        //
        // 摘要:
        //     使用指定的消息实例化一个默认的结果对象
        //
        // 参数:
        //   msg:
        //     错误消息
        public BodaResult(string msg)
            : base(msg)
        {
        }

        //
        // 摘要:
        //     使用错误代码，消息文本来实例化对象
        //
        // 参数:
        //   err:
        //     错误代码
        //
        //   msg:
        //     错误消息
        public BodaResult(int err, string msg)
            : base(err, msg)
        {
        }

        /// <summary>
        /// 创建并返回一个失败的结果对象，该对象复制另一个结果对象的错误信息
        /// </summary>
        /// <typeparam name="T1">目标数据类型一</typeparam>
        /// <typeparam name="T2">目标数据类型二</typeparam>
        /// <param name="result">之前的结果对象</param>
        /// <returns>带默认泛型对象的失败结果类</returns>
        public static BodaResult<T1, T2> CreateFailedResult(BodaResult result)
        {
            return new BodaResult<T1, T2>()
            {
                ErrorCode = result.ErrorCode,
                Message = result.Message,
            };
        }

        /// <summary>
        /// 创建并返回一个成功的结果对象，并带有两个参数对象
        /// </summary>
        /// <typeparam name="T1">第一个参数类型</typeparam>
        /// <typeparam name="T2">第二个参数类型</typeparam>
        /// <param name="value1">类型一对象</param>
        /// <param name="value2">类型二对象</param>
        /// <returns>成的结果对象</returns>
        public static BodaResult<T1, T2> CreateSuccessResult(T1 value1, T2 value2)
        {
            return new BodaResult<T1, T2>()
            {
                IsSuccess = true,
                ErrorCode = 0,
                Message = StringResources.Language.SuccessText,
                Content1 = value1,
                Content2 = value2,
            };
        }
    }
}